
#include "xxdd.h"
#include "led_task.h"

#include "led.h"

//-----任务类及任务变量在这里定义----------------
Class(Wait2Task) // 一个固定延时2秒的子任务
{
  C_task task; // 每个任务类都必须有task变量
  unsigned char i;
};

Class(WaitsecTask)
{
  C_task task;       // 每个任务类都必须有task变量
  C_Wait2Task wait2; // waitsectask拥有一个Wait2Task的子任务
  unsigned char seconds;
  unsigned char i;
};

Class(Led0Task)
{
  C_task task;           // 每个任务类都必须有task变量
  unsigned char timeon;  // LED点亮的时长
  unsigned char timelen; // LED循环点亮的周期
}
led0;

Class(Led1Task)
{
  C_task task;           // 每个任务类都必须有task变量
  unsigned char timeon;  // LED点亮的时长
  unsigned char timelen; // LED循环点亮的周期
}
led1;

Class(BreathTask) // LED呼吸灯控制任务
{
  C_task task; // 每个任务类都必须有task变量，通过控制ledtask的timeon来实现呼吸灯亮灭效果
  unsigned char i;
}
breath1;
//------------------任务函数在这里实现------------------------------------------
TaskFun(Wait2Task)
{ // 实现固定两秒延迟
  for (me.i = 0; me.i < 20; me.i++)
  {
    WaitX(100);
  }
}
EndFun

TaskFun(WaitsecTask)
{ // 实现指定的秒数延迟，之后再加上2秒延迟
  for (me.i = 0; me.i < me.seconds; me.i++)
  {
    WaitX(1000);
  }
  CallSub(Wait2Task, me.wait2); // 这里通过调用2秒固定延迟子任务，实现额外的2秒延迟。
}
EndFun

TaskFun(Led0Task)
{
  // me.timelen=20;//LED PWM总周期为20毫秒。
  //   pinMode(me.pin, OUTPUT);//设置管脚输出

  while (1)
  {
    LED0 = 0; // 电亮LED
    WaitX(1000);
    LED0 = 1; // 关闭LED
    WaitX(1000);
  }
}
EndFun

TaskFun(Led1Task)
{
  me.timelen = 100; // LED PWM总周期为20毫秒。

  while (1)
  {
    LED1 = 0; // LED on
    WaitX(me.timeon);
    LED1 = 1; // LED off
    WaitX((me.timelen - me.timeon));
  }
}
EndFun

TaskFun(BreathTask)
{ // 实现呼吸等效果
  while (1)
  {
    // 从暗到亮变化
    for (me.i = 0; me.i < 100; me.i++)
    {
      WaitX(10);
      led1.timeon = me.i;
    }
    // 再从亮到暗变化
    for (me.i = 100; me.i > 0; me.i--)
    {
      WaitX(10);
      led1.timeon = me.i;
    }
  }
}
EndFun

//------------------------------------------------------------------------
void UpdateLedTimers()
{
  // 更新顶级任务的时间
  UpdateTimer(led0);
  UpdateTimer(led1);
  UpdateTimer(breath1);
}

void runledtasks()
{

  // 执行顶级任务
  RunTask(Led0Task, led0);
  RunTask(Led1Task, led1);
  RunTask(BreathTask, breath1);

}
